/**
 * 授权管理controller.
 * @author 马玉德
 * @version 1.0.0, 2015-07-22
 */
Ext.define('MyApp.controller.GrantAuthorCtrl', {
	extend: 'Ext.app.Controller', 
    views: [
    	'GrantAuthorView'
	],
    init: function () {
    	//调用父类方法
    	this.control({
    		//窗体事件
	    	'grantauthorview': {
	    		show: this.onShow
	    	},
	    	//保存事件
	    	'grantauthorview button[name=btn-save]': {
	    		click: this.onGrantAuthor
	    	},
	    	//添加树事件
	    	'grantauthorview treepanel[name=tree]':{
	    		//树复选框选中改变事件
	    		checkchange: this.onCheckChange
	    	}
		});
    },

	/**
	 * 展开关闭节点事件
	 * @param node
	 * @constructor
     */
	TreeClick:function(node)
	{
		//设置节点展开或者关闭
		if(!node.isLeaf()) {//不是叶子节点
			node.singleClickExpand = true;//提供单击属性
			if (node.isExpanded()) {　 //节点是展开的情况
				node.collapse(true);//闭合该节点
			} else {
				node.expand(node);//展开该节点
			}
		}
	},
    /**
     * 窗体显示事件处理方法
     */
    onShow: function(win, eOpts) {
    	//创建模块树store
    	// var store = Ext.create('MyApp.store.TreeMenuStore', {
         //    url: '../../../menu/tree_menu_btns.action',
			// roles_pk: win.roleId
    	// });
		var store = Ext.create('MyApp.store.TreeMenuStore');

		store.getProxy().url = '../../../menu/tree_menu_btns.action'+"?roles_pk="+win.roleId;
		store.load();

		var tree = win.down('treepanel');
		//不重复加载数据
		tree.getRootNode().removeAll(false);
		//绑定树的store
		tree.bindStore(store);
		
		//监听store的加载事件
		store.on("load", function(store, records, successful, eOpts){
			//取得根结点
			var rootNode = tree.getRootNode();
			if(rootNode.hasChildNodes()) {
				//展开根结点
				rootNode.expand();
				
				//遍历，展开二级节点
				rootNode.eachChild(function(child){  
					child.expand();
        		});
			}
		});
    },


    //保存事件
    onGrantAuthor: function(button){
    	var win = button.up('window');
    	var tree = win.down('treepanel');
    	
    	var nodes = tree.getChecked();
    	if(null == nodes || nodes.length <= 0) {
    		WX.Ext.Util.showAlertBox('请至少选择一个权限！');
    		return false;
    	}

		var jsonArray = [];
		var roonodes = tree.getRootNode().childNodes; // 获取主节点
		findchildnode(roonodes); // 开始递归
		function findchildnode(node)
		{
			for (var i = 0; i < node.length; i++)
			{ // 从节点中取出子节点依次遍历
				var rootnode = node[i];
				jsonArray.push(rootnode.data);
				var child=node[i].childNodes;
				if (child.length > 0)
				{ // 判断子节点下是否存在子节点，个人觉得判断是否leaf不太合理，因为有时候不是leaf的节点也可能没有子节点
					findchildnode(child); // 如果存在子节点 递归
				}
			}
		}

		if (jsonArray.length > 0)
		{
			console.log(jsonArray);
			//提交保存角色的用户
			WX.Ext.Util.ajaxSubmitData('../../../roles/saveRole.action', {
				roles_pk: win.roleId,
				datas : Ext.encode(jsonArray)
			}, "赋权成功", "赋权失败！！！", function() {
				win.close();
			});
		}
    	//var mfIds = new Array();
    	//for(var i = 0; i < nodes.length; i++) {
    	//	//有子节点，则跳过
    	//	if(!nodes[i].hasChildNodes()) {
    	//		mfIds.push(nodes[i].data.id);
    	//	}
    	//}
    	//if(null == mfIds || mfIds.length <= 0) {
    	//	WX.Ext.Util.showAlertBox('请至少选择一个权限！');
    	//	return false;
    	//}
    },
    /**
     * 设置当前结点的祖先结点选中状态
     * @param node: 当前结点
     * @param checked: 选中状态
     */
    setAncestorsNodeCheckStatus: function(node, checked) {
    	var tmpNode = node;
    	var childrenCheckedCount = 0;
    	//遍历当前结点的祖先结点，设置为不选中
    	while(true) {
    		tmpNode = tmpNode.parentNode;
    		if(null == tmpNode || undefined == tmpNode) {
    			return;
    		}
    	
    		if(!checked) {
    			tmpNode.set('checked', false);
    		} else {
    			//有子结点，则要判断是否所有子结点选中，如都选中，则将本身选中
        		if(tmpNode.hasChildNodes()) {
        			childrenCheckedCount = 0;
        			//遍历子结点，取得选中个数
            		tmpNode.eachChild(function(child){  
            			if(child.get('checked')){
            				childrenCheckedCount++;
            	   		}
            		});
            		
            		//如子结点都选中，则将本身设为选中
            	    if(childrenCheckedCount == tmpNode.childNodes.length){
            	    	tmpNode.set('checked', true);
        		    }
        		}
    		}
    	}
    },
    /**
     * 设置当前结点的子结点选中状态
     * @param node: 当前结点
     * @param checked: 选中状态
     */
    setChildrenNodeCheckStatus: function(node, checked) {
    	var me = this;
    	node.eachChild(function (child){  
			child.set('checked', checked);
			
			//遍历结点的子结点，设置选中状态
	        me.setChildrenNodeCheckStatus(child, checked);
	    }); 
    },
    /**
     * 树复选框选中改变事件
     * 子节点全选中时，将父节点也选中
     */
    onCheckChange:function(node, checked){
    	//设置当前结点选中状态
		node.checked = checked;
		this.TreeClick(node);
    	//设置子结点选中状态
        this.setChildrenNodeCheckStatus(node, checked);
    	
    	//设置祖先结点选中状态
    	this.setAncestorsNodeCheckStatus(node, checked);
    }

});


